/******************************************************************************
秋夜静，独坐对残灯。
啼笑非非谁识我，坐行梦梦尽缘君，何所慰消沉。
风卷雨，雨复卷侬心。
心似欲随风雨去，茫茫大海任浮沉。
无爱亦无恨。
******************************************************************************/
#ifndef _KB_RGB_ANGLE_H_
#define _KB_RGB_ANGLE_H_

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

// precision
#define KBRGB_ANGLE_PRE     3   // 精度为 3bit
#define KBRGB_RADIUS_PRE    1   // 精度为 1bit
// 权衡精度和空间占用,该浮点运算为整数运算
#define KBRGB_ANGLE_INT_PRE     2   // 精度为 2bit
#define KBRGB_RADIUS_INT_PRE    2   // 精度为 1bit
// precision
#define KBRGB_SIN_PRE       1   // 精度为 1bit
#define KBRGB_COS_PRE       1   // 精度为 1bit
#define KBRGB_SIN_CAL_PRE   8   // 精度为 8bit
#define KBRGB_PI            (3.141592654f)
struct kbRGB_Pixel
{
    union
    {
        uint32_t pixel;
        struct
        {
            int16_t angle;   //
            uint16_t radius;
        };
    };
};
struct kbRGB_PixelLimit
{
    union
    {
        uint16_t pixel;
        struct
        {
            uint16_t angle: 10;   //
            uint16_t radius: 6;
        };
    };
};
// 整数运算采用该结构体,角度和半径的精度均为 1/4
struct kbRGB_Pixel_Int
{
    union
    {
        uint16_t pixel;
        struct
        {
            uint16_t angle: 9;   //
            uint16_t radius: 7;
        };
    };
};

#define KBRGB_ANGLE_SIZE      21

/*************************************************************************************************
* 为节省空间占用,仅计算 0-90°范围,其它角度根据象限间的关系重新计算
* 为节保留 精度并加快运算速度,将处理后的结果保存为整型，精度为 1/64
**************************************************************************************************/
//extern void cledMatrixAngle(const uint16_t cols, const uint16_t rows);
extern void kbRGB_Angle2(void);
extern void kbRGB_Angle2_Int(void);
/*************************************************************************************************
* 根据坐标通过查表的方式获取角度值和半径
* 为节保留 精度并加快运算速度,将处理后的结果保存为整型，精度为 1/64
**************************************************************************************************/
extern uint32_t kbRGB_AngleGet(const int16_t x, const int16_t y);
extern uint32_t kbRGB_Angle_IntGet(const int16_t x, const int16_t y);
extern uint32_t kbRGB_RadiusGet(const int8_t x, const int8_t y);
extern float CarmackSqrt (float x);
extern unsigned short kb_sqrt(unsigned long a);

/*************************************************************************************************
* 为节省空间占用,仅计算 0-90°范围,其它角度根据象限间的关系重新计算
* 为节保留 精度并加快运算速度,将处理后的结果保存为整型，角度精度为 1/2, 结果精度为 1/255
**************************************************************************************************/
extern void kbRGB_Sin_Cal(void);
extern void kbRGB_Cos_Cal(void);
/*************************************************************************************************
* 根据坐标通过查表的方式获取角度值和半径
* 为节保留 精度并加快运算速度,将处理后的结果保存为整型，精度为 1/255
* angle:精确到 1/2°
**************************************************************************************************/
extern int16_t kbRGB_Sin(const float angle);
//extern int16_t kbRGB_Cos(const float angle);
static inline int16_t kbRGB_Cos(const float angle)
{
    return kbRGB_Sin(angle+90.0f);
}
// 精确到 1/2°(0.5)
extern int16_t kbRGB_Sin_Int(const int16_t angle);
extern int16_t kbRGB_Sin_Int_Lin(const int16_t angle);
//static inline int16_t kbRGB_Sin_Int(const int16_t angle)
//{
//    // 整数运算,角度和半径的精度均为 1/4
//    return kbRGB_Sin((float)angle/2.0f);
//}
static inline int16_t kbRGB_Cos_Int(const int16_t angle)
{
    // 整数运算,角度和半径的精度均为 1/4
    return kbRGB_Sin_Int(angle+(90<<KBRGB_COS_PRE));
}
static inline int16_t kbRGB_Cos_Int_Lin(const int16_t angle)
{
    // 整数运算,角度和半径的精度均为 1/4
    return kbRGB_Sin_Int_Lin(angle+(90<<KBRGB_COS_PRE));
}
extern const int16_t kbRGB_SinMax;// = ((uint16_t)0x1<<(KBRGB_SIN_CAL_PRE))-1;

#ifdef __cplusplus
}
#endif

#endif // _KB_RGB_ANGLE_H_
